const AppError = require('./AppError');

/**
 * 保留对象的指定属性
 * @param {*} obj
 * @param  {...any} props
 * @returns
 */
exports.pick = function (obj, ...props) {
	if (!obj || typeof obj !== 'object') {
		return obj;
	}
	const newObj = {};
	for (const key in obj) {
		if (props.includes(key)) {
			newObj[key] = obj[key];
		}
	}
	return newObj;
};

/**
 * @param {*} vis  validate.js 校验函数
 * @param {*} data  校验数据
 * @returns 是否验证失败
 */
exports.visHandler = function (vis, data) {
	let res = vis(data);
	if (res) {
		// 验证失败统一处理
		console.log('验证失败', res);
		return res;
	} else {
		console.log('通过验证');
	}
};

/**
 * 请求返回数据
 * @param {*} data
 * @param {*} success 提示消息
 * @returns
 */
function sendResult(data, msg = 'success') {
	return {
		code: 0,
		msg,
		data
	};
}
exports.sendResult = sendResult;

/**
 * 捕获异常通用封装，返回结果需要再次处理
 * @param {*} promise
 * @returns
 *
 * 使用：let [error, result] = await to(adminServ.findByPage(searchObj));
 */
exports.to = function (promise) {
	return promise
		.then((data) => [null, data]) // 成功时返回 [null, 数据]
		.catch((error) => [error, undefined]); // 失败时返回 [错误, undefined]
};

/**
 * 捕获异常通用封装，返回结果不需要处理
 * @param {*} promise
 * @returns
 *
 * 使用：await toi(adminServ.findByPage(searchObj),res,next);
 */
exports.toi = function (promise, res, next) {
	return promise
		.then((data) => res.send(sendResult(data))) // 将数据格式化后返回客户端
		.catch((error) => next(new AppError(error))); // 进入异常中间件进行处理
};

/**
 * 解析 MySql toJSON
 * @param {*} data mysql查询，结果需要 toJSON 的数据
 * @param {*} msg  未查询到接的的提示消息
 * @returns
 */
exports.dataToJSON = function (data, msg = '') {
	if (!data && msg) {
		throw new Error(msg);
	}
	if (!data && !msg) {
		return [];
	}
	return data?.toJSON();
};

/**
 * 数据库删除或更新记过处理
 */
exports.dataDeleteOrUpdateRes = function (data) {
	if (typeof data === 'number') {
		if (data >= 1) {
			return `成功删除 ${data} 条记录`;
		} else {
			throw new AppError('删除失败', 400);
		}
	} else if (Array.isArray(data)) {
		if (data[0] >= 1) {
			return `成功影响 ${data[0]} 条记录`;
		} else {
			throw new AppError('操作失败', 400);
			// return next(new AppError(`修改失败 ${data}`, 400));
		}
	} else {
		return data;
	}
};
